.TITLE SAVXT - DW/DZ COMMON DRIVER .IDENT /01.06/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; ; P. J. BEZEREDI / I. P. ZATKOVICH 05-MAY-82 ; ; MODIFIED BY: ; ; T. LEKAS 11-JUL-82 ; TL203 -- REMOVE UNNEEDED INSTRUCTIONS IN ORDER ; TO GET SAVXT TO FIT. ; ; P. J. BEZEREDI 13-JUL-82 ; PB322 -- STREAMLINE DRIVER EVEN FURTHER. ; ; T. LEKAS 15-JUL-82 ; TL205 -- FIX PB322 - THE DRIVER WAS UNMAPPING ITSELF WHEN ; WHEN RUNNING IN APR6 ; ; M. Pettengill 15-July-1982 ; MLP074 - Correct retry logic to actually retry 4 times ; and to jump to the correct location in boot rom ; ; ; THIS MODULE CONTAINS A SPECIAL DRIVER USED BY BOOT AND SAVE ; TO READ AND WRITE SYSTEM IMAGES. ; ; DRIVER INPUTS: ; R2 = NOT USED ; R3 = NOT USED ; R4 = UNIT NUMBER ; R5 = 0 USE CSR ADDRESS STORED IN THE DRIVER ; R5 <> 0 USE CSR ADDRESS STORED IN R5 ; ; DRIVER OUTPUTS: ; R0 = RESIDUAL BLOCK COUNT ; R2 = POSSIBLE MEMORY SIZE FROM CONFIGURATION TABLE ; PB322 ; R1 = DEVICE NAME IN ASCII ; R4 = PHYSICAL UNIT NUMBER ; R5 = CSR ADDRESS ; .MCALL HWDDF$ HWDDF$ ; ; DRIVER TABLE ; .PSECT DRVTAB,RW,D,GBL,REL,CON .ASCII /XT/ ; XT COMMON DRIVER .WORD XTLLEN ; ADDRESS OF LOAD LENGTH .WORD XTSA ; ADDRESS OF BUFFER ADDRESS .WORD XTFUN ; ADDRESS OF FUNCTION CODE/UNIT .WORD $XTDRV ; DRIVER ENTRY ADDRESS .WORD /2; SIZE OF DRIVER IN WORDS .WORD 160 ; WRITE FUNCTION CODE .WORD 100 ; READ FUNCTION CODE .WORD 0 ; UNIT SELECT BITS .WORD XTFUN ; ADDRESS OF FUNCTION CODE WORD .WORD XTCSR ; ADDRESS OF CSR ADDRESS .PSECT ; ; SPECIAL DRIVER ; $XTDRV::BR XT0 ;;; BR AROUND FIXED STUFF XTNAM: .WORD "XT ;;; GENERIC DEVICE NAME XTCSR: .WORD 0 ;;; DEFAULT CSR ADDRESS XTFUN: .WORD 0 ;;; FUNCTION CODE AND UNIT NUMBER XT0: TST R5 ;;; CSR ADDRESS SUPPLIED? BNE 5$ ;;; IF NE YES MOV XTCSR,R5 ;;; NO, GET SAVED CSR ADDRESS 5$: MOV #1,@#SR0 ;;; MAKE SURE MEMORY MANAGEMENT IS ON MOV #1400,@#KISAR3 ;;; MAP TO POSSIBLE CONFIGURATION TABLE ; PB322 MOVB @#77707,XTSIZ+1;;; SAVE MEMORY SIZE ; PB322 MOV PC,R3 ;;; SET ADDRESS FOR PIC CODE ADD #,R3 ;;; ... MOV @#6,XTBLK ;;; SAVE STARTING BLOCK NUMBER MOVB R4,1(R3) ;;; SAVE THE UNIT NO. BITB #20,(R3) ;;; IS THIS A WRITE FUNCTION? BEQ 6$ ;;; IF EQ NO MOV 15$,MOVE ;;; SET GENERIC FILL SILO INSTRUCTION 6$: CMP #401,(R5) ;;; IS THIS AN RD50? BNE 20$ ;;; IF NE NO ; ; RD50 SETUP CODE ; MOV #"DW,XTNAM ;;; SET RD50 DEVICE NAME BIC #100000,MOVE ;;; CONVERT A MOVB TO A MOVB BITB #20,(R3) ;;; IS THIS A READ FUNCTION? BEQ 10$ ;;; IF EQ YES MOVB #60,(R3) ;;; NO, SET WRITE COMMAND BR XTRTY ;;; 10$: MOVB #40,(R3) ;;; SET READ COMMAND BR XTRTY ;;; 15$: MOVB (R1)+,(R2) ;;; FILL SILO INSTRUCTION ; ; RX50 SETUP CODE ; 20$: MOV #"DZ,XTNAM ;;; SET RX50 DEVICE NAME ASL R4 ;;; SHIFT UNIT NUMBER BISB R4,(R3) ;;; SET UNIT NUMBER ; ; COMMON PARAMETER SETUP ; ; TEST NUMBER OF RETRIES. IF MORE THAN FOUR, QUIT AND ; JUMP TO DIAGNOSTIC ROM TO CONTINUE BOOT PROCESS ; WITH NEXT DEVICE. ; XTRTY: DEC (PC)+ ;;; ANY RETRIES LEFT ? .WORD 4 ;;; (FOUR RETRIES) BPL 25$ ;;; IF NE YES ; MLP074 JMP @#167700 ;;; TRY BOOTING THE NEXT DEVICE IN SEQUENCE ; MLP074 25$: MOV (PC)+,R1 ;;; GET BUFFER ADDRESS ;**-2 XTSA: .WORD 0 ;;; CLC ;;; CONVERT TO 32WD BLOCK ADDRESS ROL R1 ;;; ... ROL R1 ;;; ... SWAB R1 ;;; ... MOV R1,@#KISAR3 ;;; SETUP APR3 TO MAP TO BUFFER MOV (PC)+,R4 ;;; GET LOAD LENGTH XTLLEN: .WORD 0 ;;; MOV #0,SBLK ;;; SET STARTING LBN XTBLK= .-4 ;;; XTLOOP: MOV (PC)+,R1 ;;; GET CURRENT LBN SBLK: .WORD 0 ;;; TST MOVE ;;; IS THIS AN RD50? ; PB322 BMI DZLOOP ;;; IF MI NO ; PB322 ; ;**-2 ; RD50 BASIC LOOP ; DWLOOP: TST 20(R5) ;;; IS THE UNIT BUSY? BMI DWLOOP ;;; IF MI YES, WAIT FOR IT INC R1 ;;; MAKE IT LOGICAL I/O MOV R1,R2 ;;; COPY IT BIC #177760,R2 ;;; ISOLATE SECTOR NUMBER ASH #-4,R1 ;;; RIGHT JUSTIFY TRACK AND HEAD CLR R0 ;;; GET READY FOR THE DIVIDE DIV #4,R0 ;;; CALCULATE CYLINDER AND HEAD MOVB R2,6(R5) ;;; SET SECTOR # MOVB R0,12(R5) ;;; SET TRACK # MOV R1,14(R5) ;;; SET HEAD # MOVB (R3),16(R5) ;;; START THE FUNCTION BR COMMON ;;; GET INTO COMMON LOOP ; ; RX50 BASIC LOOP ; DZLOOP: CALL DZTRK ;;; CONVERT LBN TO DISK ADDRESS MOVB (R3),4(R5) ;;; LOAD THE FUNCTION MOVB R1,10(R5) ;;; SET SECTOR # MOVB R0,6(R5) ;;; SET TRACK # TSTB 22(R5) ;;; CLEAR RX50 SILO ; ; COMMON TRANSFER LOOP ; COMMON: BITB #20,(R3) ;;; IS THIS A READ FUNCTION? BEQ 10$ ;;; IF EQ YES CALL SILO ;;; NO, FILL SILO BEFORE WRITING 10$: CALL WAIT ;;; WAIT FOR FUNCTION TO FINISH BCS XTRTY ;;; IF CS ERROR, TRY AGAIN INC SBLK ;;; UPDATE CURRENT LBN BITB #20,(R3) ;;; WAS THIS A READ FUNCTION? BNE 20$ ;;; IF NE NO, TEST FOR END CALL SILO ;;; YES, EMPTY SILO 20$: SOB R4,XTLOOP ;;; LOOP IF MORE LBNS REMAIN BR XTDONE ;;; ALL FINISHED ; PB322 ;**-1 ; ; PERFORM SILO/MEMORY TRANSFERS ; .ENABL LSB SILO: MOV #512.,R0 ;;; SET COUNT OF BYTES IN SILO MOV R5,R2 ;;; COPY CSR ADDRESS ADD #20,R2 ;;; POINT TO RX50 DATA BUFFER MOV #60000,R1 ;;; SET BASE FOR APR6 MAPPING TST MOVE ;;; IS THIS AN RD50? ; PB322 BMI 5$ ;;; IF MI NO ; PB322 SUB #10,R2 ;;; POINT TO RD50 DATA BUFFER ;**-2 ASR R0 ;;; CONVERT BYTES TO WORDS 5$: CMP #"DW,XTNAM ;;; IS THIS THE RD50? BNE MOVE ;;; IF NE NO TSTB 20(R5) ;;; READY FOR NEXT MOVE? BPL 5$ ;;; IF PL NO MOVE: MOVB (R2),(R1)+ ;;; EMPTY SILO (WILL CHANGE TO FILL SILO) SOB R0,5$ ;;; LOOP UNTIL DONE ADD #10,@#KISAR3 ;;; UPDATE APR3 MAPPING BY 256. WORDS TST (PC)+ ;;; IS THE NXM TRAP SETUP? TRPFLG: .WORD 0 ;;; FLAG=0 FIRST TIME THRU BNE XIT ;;; IF NE NO MOV @#4,(PC)+ ;;; SAVE CURRENT TRAP 4 VECTOR TRPPC: .WORD 0 ;;; MOV @#6,(PC)+ ;;; ... TRPPS: .WORD 0 ;;; INC TRPFLG ;;; INDICATE THAT WE HAVE BEEN HERE MOV #PR7,@#6 ;;; SET NEW PS MOV PC,R0 ;;; CALCULATE TRAP ADDRESS ADD #,R0 ;;; ... MOV R0,@#4 ;;; SET NEW PC XIT: RETURN ;;; .DSABL LSB ; ; WAIT FOR OPERATION TO COMPLETE ; WAIT: TST MOVE ;;; IS THIS THE RD50? ; PB322 BMI 10$ ;;; IF MI NO ; PB322 5$: TST 20(R5) ;;; DONE? ;**-3 BMI 5$ ;;; IF MI NO BITB #1,17(R5) ;;; ANY ERRORS? BR 20$ ;;; EXIT 10$: TST 24(R5) ;;; START RX50 15$: BITB #10,4(R5) ;;; DONE? ;**-1 BEQ 15$ ;;; IF EQ NO BITB #200,4(R5) ;;; ANY ERRORS? 20$: BEQ 30$ ;;; IF EQ NO SEC ;;; INDICATE ERROR 30$: RETURN ;;; ; ; CONVERT RX50 LBN TO PHYSICAL DISK ADDRESS ; DZTRK: CLR R0 ;;; SIGN EXTEND R1 ; TL203 DIV #10.,R0 ;;; DIVIDE BY # OF SECTORS PER TRACK ; TL203 CMP #4,R1 ;;; C=1 IF 5<=R1<=9. ;**-11 ROL R1 ;;; DOUBLE FOR INTERLEAVE FACTOR ASL R0 ;;; ADD FOR TRACK TO TRACK SKEW ADD R0,R1 ;;; SKEW BY 2*TRACK ASR R0 ;;; RESTORE TRACK # MOV #10.,R2 ;;; SET MODULUS 30$: SUB R2,R1 ;;; PUT SECTOR IN RANGE -10. TO -1 BGE 30$ ;;; IF GE LOOP UNTIL REMAINDER IS MINUS ADD R2,R1 ;;; NORMALIZE SECTOR # INC R1 ;;; FORGET SECTOR 0 INC R0 ;;; CONVERT TRACK TO LOGICAL OPERATION CMP R0,#120 ;;; DO WE NEED TO WRAP? BNE 40$ ;;; IF NE NO CLR R0 ;;; WRAP AROUND 40$: RETURN ;;; ; ; WE ARE FINISHED ; TRP4: XTDONE: MOV TRPPC,@#4 ;;; RESTORE PC MOV TRPPS,@#6 ;;; RESTORE PS MOV R4,R0 ;;; GET RESIDUAL BLOCK COUNT MOV (PC)+,R2 ;;; GET SYSTEM SIZE ; PB322 XTSIZ: .WORD 0 ;;; ; PB322 MOVB 1(R3),R4 ;;; GET UNIT NUMBER MOV XTNAM,R1 ;;; GET DEVICE NAME XTEND: RETURN ;;; .END